// 声明一个约定好类型的函数接口 ： 参数名可以不一样，但是对应位置的数据类型要一样

// 函数接口：接口interface不单可以描述对象，也可以描述函数，对函数的结构进行约束。
interface Ifn1 {
  // () 里约定参数，括号外面约定返回值
  (a: number, b: number, c?: boolean): boolean;
}
let sum1: Ifn1 = function (d: number, b: number): boolean {
  return d + b > 9;
};

console.log(sum1(7, 7)); // true

// 注意：对于函数类型的类型检查来说，函数的参数名不需要与接口里定义的名字相匹配。函数的参数会逐个进行检查，要求对应位置上的参数类型是兼容的。

interface ISum {
  (x: number, y: number, z?: number | undefined): number;
}

let func1: ISum = function (x: number, y: number): number {
  return x + y;
};
console.log(func1(100, 300));  // 400

let func2: ISum = function (
  x: number,
  y: number,
  z?: number | undefined
): number {
  if (z) return x + y + z;
  else return x + y;
};
console.log(func2(100, 300));  // 400
